package base.jdk8_demo.lambda.demo07;

import base.jdk8_demo.lambda.demo02.Emp;
import base.jdk8_demo.lambda.demo02.Status;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * Stream 的终止操作演示
 */
public class TestStream2 {
    List<Emp> emps1 = Arrays.asList(
            new Emp("zs",16,2000.0, Status.VACATION),
            new Emp("ls", 18, 3000.0, Status.FREE),
            new Emp("ww", 17, 2500.0, Status.FREE)
    );
    List<Emp> emps2 = Arrays.asList(
            new Emp("zs",16,2000.0, Status.VACATION),
            new Emp("ls", 18, 3000.0, Status.FREE),
            new Emp("ww", 17, 2500.0, Status.VACATION),
            new Emp("zl", 19, 4000.0, Status.FREE),
            new Emp("dg", 20, 6000.0, Status.BUSY),
            new Emp("tom", 21, 6000.0, Status.BUSY)
    );

    /**
     * 1.3 Stream 的终止操作
     * 查找与匹配
     * allMatch -检查是否匹配所有元素
     * anyMatch -检查是否至少匹配一个元素
     * noneMatch -检查是否没有匹配的元素，即一个都不匹配
     * findFirst -返回第一个元素
     * findAny -返回当前流中的任意元素
     * count -返回流中元素的总个数
     * max -返回流中最大值
     * min -返回流中最小值
     */
    @Test
    public void allMatchTest(){
        // 检查是否所有工资>=5000的员工都处于忙碌状态
        boolean b1 = emps2.stream()
                .filter(emp -> emp.getSalary()>=5000)
                .allMatch(emp -> emp.getStatus().equals(Status.BUSY));
        System.out.println("工资大于等于5k的员工都处于忙碌状态吗？: "+b1);

    }
    @Test
    public void anyMatchTest(){
        //
        boolean b2 = emps2.stream()
                .anyMatch(emp -> emp.getStatus().equals(Status.VACATION));
        System.out.println("至少有一个员工处于休假状态吗？："+b2);
    }
    @Test
    public void noneMatchTest(){
        boolean b3 = emps1.stream()
                .noneMatch(emp -> emp.getStatus().equals(Status.BUSY));
        System.out.println("没有一个员工处于忙碌状态？: "+b3);
    }
    @Test
    public void findFirstTest(){
        Optional<Emp> op = emps2.stream()
//                .sorted((e1,e2) -> -e1.getSalary().compareTo(e2.getSalary()))
                .sorted((e1,e2)-> -Double.compare(e1.getSalary(),e2.getSalary()))
                .findFirst();
//                .forEach(System.out::println);

        System.out.println("工资最高的员工是："+op.get());
    }
    @Test
    public void findAnyTest(){
        Optional<Emp> any = emps2.stream()
                .filter(emp -> emp.getStatus().equals(Status.FREE))
                .findAny();

        System.out.println("找一个空闲员工加入开发团队: "+any.get());
    }
    // parallelStream()是并行流方式处理，stream()是串行处理集合数据
    @Test
    public void maxTest(){
        Optional<Emp> max = emps2.parallelStream()
                .max((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));

        System.out.println("工资最高员工是："+ max.get());
    }
    @Test
    public void minTest(){
        Optional<Double> min = emps2.parallelStream()
                .map(Emp::getSalary)
//                .min((d1, d2) -> Double.compare(d1, d2));
//                .min((d1, d2) -> d1.compareTo(d2));
                .min(Double::compare);

        System.out.println("最低工资是： "+min.get());
    }
}
